#include <stdio.h>
#include <conio.h>
struct Book{
    int bookId;
    char bookName[50];
    char author[50];
    int bookPrice;
    int quantityInLibrary;
    int quantityIssued ;
};

struct Member{
    int memberId;
    char memberName[50];
    int memberFine;
    int noOfBooksIssued;
    int isMember;
};


void displayDetailsOfAllMembers(struct Member members[] ,int noOfMembers)
{
    for(int i=0;i<noOfMembers;i++)
    {
        printf("\nMember ID: %d",members[i].memberId);
        printf("\nFine due: %d",members[i].memberFine);
        printf("\nNo. of Books Issued: %d",members[i].noOfBooksIssued);
    }
}

void displayDetailsOfOneBook(struct Book book)
{
    printf("\n\n**********************************BOOK DETAILS*****************************************");
    printf("\n\nBook ID: %d",book.bookId);
    printf("\nBook Name: %s",book.bookName);
    printf("\nAuthor: %s",book.author);
    printf("\nBook Price: %d",book.bookPrice);
    printf("\nCurrent Quantity of Book: %d",book.quantityInLibrary);
    printf("\nQuantity of Book Issued: %d",book.quantityIssued);
    printf("\n\n****************************************************************************************");
}

void displayDetailsOfOneMember(struct Member member)
{
    printf("\nMember ID: %d",member.memberId);
    printf("\nMember Name: %s",member.memberName);
    printf("\nFine due: %d",member.memberFine);
    printf("\nNo. of Books Issued: %d",member.noOfBooksIssued);
}

void addBook(struct Book books[] ,int noOfBooks)
{
    /// Adding books
    printf("\nADD BOOKS :");

    for(int i=0;i<noOfBooks;i++)
    {
        printf("\nEnter Book ID: ");
        fflush(stdin);
        scanf("%d" ,&books[i].bookId);

        printf("\nEnter Book Name: ");
        fflush(stdin);
        scanf("%s" , &books[i].bookName);

        printf("\nEnter the name of the author: ");
        fflush(stdin);
        scanf("%s" , &books[i].author);

        printf("\nEnter the price of the book (in Rs.): ");
        fflush(stdin);
        scanf("%d",&books[i].bookPrice);

        printf("\nEnter the quantity of this book in the library: ");
        fflush(stdin);
        scanf("%d",&books[i].quantityInLibrary);

        books[i].quantityIssued = 0;

        displayDetailsOfOneBook(books[i]);
    }
}

void addMember(struct Member members[] , int noOfMembers)
{
    for(int i=0;i<noOfMembers;i++)
    {
        printf("\nEnter the member Id:");
        fflush(stdin);
        scanf("%d",&(members[i].memberId));
        printf("\nEnter the member name:");
        fflush(stdin);
        scanf("%s",members[i].memberName);
        members[i].isMember = 1;
        members[i].noOfBooksIssued = 0;
        members[i].memberFine = 0;

        displayDetailsOfOneMember(members[i]);
    }
}


int main()
{
    printf("******************************************   MADE BY   ***********************************************");
    printf("\nNAME: PRABHAKAR KUMAR");
    printf("\nROLL NO: 03716412819");
    printf("\nCOURSE: BTech(ECE)");
    printf("\nSUBJECT: OBJECT ORIENTED PROGRAMMING");
    printf("\n\n***************************************************************************************************");

    int noOfBooks;
    int noOfMembers;
    struct Member members[10];
    struct Book books[10];

    while(1)
    {
        printf("\nMONTH : SEPTEMBER\nYEAR:2020");
        printf("\n\n**********************    MAIN MENU   ***************************");
        printf("\n1. ADD BOOKS");
        printf("\n2. ISSUE A BOOK");
        printf("\n3. RETURN A BOOK");
        printf("\n4. ADD MEMBERS");
        printf("\n5. DELETE MEMBERSHIP");
        printf("\n6. DISPLAY DETAILS OF ALL BOOKS");
        printf("\n7. DISPLAY DETAILS OF ALL MEMBERS");
        printf("\n8. EXIT");
        printf("\n*******************************************************************");
        int ch;
        printf("\nENTER YOUR CHOICE -");
        scanf("%d",&ch);
        switch(ch)
        {
        case 1:
            {
                printf("\nEnter the No. Of Books: ");
                fflush(stdin);
                scanf("%d" , &noOfBooks);
                addBook(books , noOfBooks);
                break;
            }
        case 2:
            {
                ///Issue Book to A Member
                int id,bookid;
                int canBeIssued = 1;
                printf("\nEnter The Member ID: ");
                fflush(stdin);
                scanf("%d",&id);
                int i;
                for(i=0;i<noOfMembers;i++)
                {
                    if(members[i].memberId==id)
                        break;
                }
                printf("\nEnter the ID of the Book you want to be issued: ");
                scanf("%d",&bookid);
                int j;
                for(j=0;j<noOfBooks;j++)
                {
                    if(books[j].bookId == bookid)
                    {
                        if(books[j].quantityInLibrary <= 0)
                        {
                            canBeIssued = 0;
                            printf("\n\nSorry, Book You Want to Issue Is not available currently!");
                        }
                    break;
                    }
                }

                if(canBeIssued == 0)
                    break;
                else
                    books[j].quantityIssued++;
                char date[50];
                printf("Enter the date of issuing the book:");
                scanf("%s" ,&date);

                printf("\nThe book with Book Id: %d",bookid);
                printf(" has been issued to Member %d" , members[i].memberId);
                printf(" on %s", date);
                members[i].noOfBooksIssued ++;

                printf("\nDETAILS OF THE BOOK ISSUED:\n");
                displayDetailsOfOneBook(books[j]);
                printf("\nDETAILS OF THE MEMBER WHO ISSUED THE BOOK\n");
                displayDetailsOfOneMember(members[i]);
                break;
            }
        case 3:
            {
                int mid , bid ,days;
                ///Returning a Book
                printf("\nEnter the Member ID - ");
                scanf("%d" , &mid);

                printf("\nEnter The book ID - ");
                scanf("%d" , &bid);

                printf("\nEnter The No of Days Since Issue - ");
                scanf("%d" ,&days);
                days = days-7;


                for(int i=0;i<noOfMembers;i++)
                {
                    if(members[i].memberId == mid)
                    {
                        if(days<=0)
                        {
                            printf("\n\n Thank You For returning the book in time");
                        }
                        else
                        {
                            printf("\n\n You have returned the books %d",days);
                            printf(" late.\n Thus, a fine of Rs. %d",days);
                            printf(" will be charged");
                            members[i].memberFine += days;
                        }

                        ///members[i].status[j] = "RETURNED ON "+ to_string(rdate) +"SEPTEMBER 2020";
                        members[i].noOfBooksIssued-- ;
                        displayDetailsOfOneMember(members[i]);
                        break;
                    }
                }
            break;
            }
        case 4:
            {
                ///Adding Members
                printf("\nADD MEMBERS :");
                printf("\nEnter The No. of Members you want to add: ");
                scanf("%d" ,&noOfMembers);
                addMember(members , noOfMembers);
                break;
            }
        case 5:
            {
                int mid;
                ///Delete A Membership
                printf("\nEnter the Member ID - ");
                scanf("%d" ,&mid);
                for(int i=0;i<noOfMembers;i++)
                {
                    if(members[i].memberId == mid)
                    {
                        if(members[i].isMember == 0)
                            printf("\nThis member's membership has already been deleted.\n");
                        else
                        {
                            members[i].isMember = 0;
                            printf("\nMEMBERSHIP OF MEMBER - %d HAS BEEN DELETED !\n",members[i].memberId);
                        }
                    }
                }
                break;
            }
        case 6:
            {
                ///Display Details Of All the Books
                for(int i=0;i<noOfBooks;i++)
                {
                    displayDetailsOfOneBook(books[i]);
                    printf("\n\n");
                }
                break;
            }
        case 7:
            {
                ///Display Details Of ALl the Members
                for(int i=0;i<noOfMembers;i++)
                {
                    if(members[i].isMember)
                    {
                        displayDetailsOfOneMember(members[i]);
                        printf("\n\n");
                    }
                }
                break;
            }
        case 8:
            {
                ///Exit
                return 0;
            }
        }
    }
}
